草庐IT

c - WaitForMultipleObjects 堆栈

全部标签

linux - Linux 中的堆栈预故障 - 需要单个或多个故障

在Linux中,当进程从系统请求一些(虚拟)内存时,它只是在vma(进程虚拟内存的描述符)中注册,但在调用时并未保留每个虚拟内存的物理页面。之后,当进程要访问这个页面时,就会出错(访问会产生PageFault中断),PF#handler会分配物理页面并更新进程页表。有两种情况:读取时出错可能变成链接到写保护的零页(特殊全局预置零页);和写入错误(在零页和只是需要但尚未物理映射的页上)将导致实际的私有(private)物理页分配。对于mmaps(和brk/sbrk,它也是内部mmap),这个方法是每页的;所有mmaped区域都在vma中作为整体注册(它们具有开始和结束地址)。但是堆栈以其

linux - Linux 中的堆栈预故障 - 需要单个或多个故障

在Linux中,当进程从系统请求一些(虚拟)内存时,它只是在vma(进程虚拟内存的描述符)中注册,但在调用时并未保留每个虚拟内存的物理页面。之后,当进程要访问这个页面时,就会出错(访问会产生PageFault中断),PF#handler会分配物理页面并更新进程页表。有两种情况:读取时出错可能变成链接到写保护的零页(特殊全局预置零页);和写入错误(在零页和只是需要但尚未物理映射的页上)将导致实际的私有(private)物理页分配。对于mmaps(和brk/sbrk,它也是内部mmap),这个方法是每页的;所有mmaped区域都在vma中作为整体注册(它们具有开始和结束地址)。但是堆栈以其

linux - 32 位 x86 汇编中堆栈对齐的职责

我试图清楚地了解谁(调用者或被调用者)负责堆栈对齐。64位汇编的情况很清楚,它是由caller完成的。引用SystemVAMD64ABI,第3.2.2节堆栈框架:Theendoftheinputargumentareashallbealignedona16(32,if__m256ispassedonstack)byteboundary.换句话说,应该安全地假设,对于被调用函数的每个入口点:16|(%rsp+8)持有(额外八个是因为call隐含地将返回地址压入堆栈)。它在32位世界中看起来如何(假设cdecl)?我注意到gcc使用以下构造将对齐放在被调用函数中:andesp,-16这似乎

linux - 32 位 x86 汇编中堆栈对齐的职责

我试图清楚地了解谁(调用者或被调用者)负责堆栈对齐。64位汇编的情况很清楚,它是由caller完成的。引用SystemVAMD64ABI,第3.2.2节堆栈框架:Theendoftheinputargumentareashallbealignedona16(32,if__m256ispassedonstack)byteboundary.换句话说,应该安全地假设,对于被调用函数的每个入口点:16|(%rsp+8)持有(额外八个是因为call隐含地将返回地址压入堆栈)。它在32位世界中看起来如何(假设cdecl)?我注意到gcc使用以下构造将对齐放在被调用函数中:andesp,-16这似乎

c - 有没有办法在运行时确定可用的堆栈空间?

我知道堆栈大小是固定的。所以我们不能在堆栈上存储大对象,我们转向动态分配(例如malloc)。此外,当存在函数调用嵌套时会使用堆栈,因此我们也因此避免了递归函数。有没有办法在运行时确定到目前为止使用了多少堆栈内存以及还剩下多少?在这里,我假设使用x86架构的linux环境(gcc编译器)。 最佳答案 有一个pthreadAPI可以确定堆栈的位置:#includevoidPrintStackInfo(void){pthread_attr_tAttributes;void*StackAddress;intStackSize;//Gett

c - 有没有办法在运行时确定可用的堆栈空间?

我知道堆栈大小是固定的。所以我们不能在堆栈上存储大对象,我们转向动态分配(例如malloc)。此外,当存在函数调用嵌套时会使用堆栈,因此我们也因此避免了递归函数。有没有办法在运行时确定到目前为止使用了多少堆栈内存以及还剩下多少?在这里,我假设使用x86架构的linux环境(gcc编译器)。 最佳答案 有一个pthreadAPI可以确定堆栈的位置:#includevoidPrintStackInfo(void){pthread_attr_tAttributes;void*StackAddress;intStackSize;//Gett

c - 为什么每次运行时堆栈使用量不同而不是固定数量时会发生堆栈溢出?

我正在Debian操作系统上运行一个带有递归调用的程序。我的筹码量是-s:stacksize(kbytes)8192据我所知,堆栈大小必须是固定的,并且应该与每次运行时必须分配给程序的大小相同,除非用ulimit显式更改它。.递归函数递减一个给定的数字,直到它达到0。.这是用Rust编写的。fnprint_till_zero(x:&muti32){*x-=1;println!("Variableis{}",*x);while*x!=0{print_till_zero(x);}}并且值被传递为staticmutY:i32=999999999;unsafe{print_till_zero(

c - 为什么每次运行时堆栈使用量不同而不是固定数量时会发生堆栈溢出?

我正在Debian操作系统上运行一个带有递归调用的程序。我的筹码量是-s:stacksize(kbytes)8192据我所知,堆栈大小必须是固定的,并且应该与每次运行时必须分配给程序的大小相同,除非用ulimit显式更改它。.递归函数递减一个给定的数字,直到它达到0。.这是用Rust编写的。fnprint_till_zero(x:&muti32){*x-=1;println!("Variableis{}",*x);while*x!=0{print_till_zero(x);}}并且值被传递为staticmutY:i32=999999999;unsafe{print_till_zero(

c - 使用 setrlimit() 设置堆栈大小并引发堆栈溢出/段错误

在下面给出的示例中,我尝试将堆栈大小设置为1kb。为什么现在可以在foo()中分配大小为8kb的整数数组?#include#includevoidfoo(void);intmain(){structrlimitlim={1024,1024};if(setrlimit(RLIMIT_STACK,&lim)==-1)return1;foo();return0;}voidfoo(){unsignedints[2048];printf("foo:%u\n",ints[2047]=42);} 最佳答案 立即设置限制,但仅在尝试分配新堆栈或尝试

c - 使用 setrlimit() 设置堆栈大小并引发堆栈溢出/段错误

在下面给出的示例中,我尝试将堆栈大小设置为1kb。为什么现在可以在foo()中分配大小为8kb的整数数组?#include#includevoidfoo(void);intmain(){structrlimitlim={1024,1024};if(setrlimit(RLIMIT_STACK,&lim)==-1)return1;foo();return0;}voidfoo(){unsignedints[2048];printf("foo:%u\n",ints[2047]=42);} 最佳答案 立即设置限制,但仅在尝试分配新堆栈或尝试